package concurrent.chapter1;

/**
 * 03讲、介绍三种高效优雅的Singleton实现方式
 */
//double check add volatile
public class SingletonObject5 {
    //加volatile并不能保证原子性，
    // 但可以保证内存的可见性，就是多个线程看到的数据是同一个，
    //保证有序性，明确的告诉编译器不要去优化，严格遵循happens-before
    //读的时候写必须全部已完成
    private static volatile SingletonObject5 instance;

    private SingletonObject5() {
        //empty
    }

    public static SingletonObject5 getInstance() {
        if (null == instance) {
            synchronized (SingletonObject5.class) {
                if (null == instance)
                    instance = new SingletonObject5();
            }
        }
        return SingletonObject5.instance;
    }

}
